package com.yf.service.im.impl;

import com.yf.channel.MyChannelGroup;
import com.yf.channel.Session;
import com.yf.enums.ChatTypeEnum;
import com.yf.enums.MsgEnum;
import com.yf.im.protocol.MsgFactory;
import com.yf.im.protocol.MsgPb;
import com.yf.service.MsgCenterService;
import com.yf.util.GroupUtil;
import com.yf.util.SessionUtil;
import com.yf.dao.im.MsgGroupDao;
import com.yf.service.im.GroupUserService;
import com.yf.service.im.MsgService;
import com.yf.service.im.MsgSessionService;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

@Service
public class MsgCenterServiceImpl implements MsgCenterService {

    /*********内部方法*********/


    @Autowired
    private GroupUserService groupUserService;

    @Autowired
    private MsgService msgService;

    @Autowired
    private MsgGroupDao msgGroupDao;

    @Autowired
    private MsgSessionService msgSessionService;

    private AtomicInteger atomicInteger = new AtomicInteger(0);

    /**
     * 处理消息
     */
    public void handleMsg(ChannelHandlerContext ctx, MsgPb.Message msg) {


        if (MsgEnum.CONNECT.getState().equals(msg.getType())) {//连接
            SessionUtil.createSession(ctx, msg);
            for (Long groupId : msg.getGroupIdsList()) {
                //加入群聊
                GroupUtil.joinGroup(groupId, ctx.channel());
                //广播出去 上线
                GroupUtil.getGroup(groupId).broadcast(MsgFactory.createOnlineMsg(msg.getFromId(), groupId));
            }
//            sendHello(ctx.channel());//回复欢迎
        } else if (MsgEnum.KEEPALIVE.getState().equals(msg.getType())) {//心跳
            sendHeart(ctx.channel());//回复心跳
        } else if (MsgEnum.FRIEND.getState().equals(msg.getType())) {//发送好友请求
            sendMsg(msg);//直接发送
        } else if (MsgEnum.SIGNED.getState().equals(msg.getType())) {
            sendMsg(msg);//直接发送
        } else { //TEXT MSG MEDIA 类消息 直接转发
            System.out.println(msg.getFromId() + "给" + msg.getToId() + "发出的消息,内容为：" + msg.getContent());
            if (msg.getChatType() == ChatTypeEnum.GROUPCHAT.getState()) {//群聊消息
                sendGroupMsg(msg);
            } else {//单聊消息
                sendMsg(msg);
            }


//保存消息 采用rabbitmq等队列处理 TODO
//            msg msg = msgService.saveMsg(msg);

            //sessionText保存要处理
//            String msgContent = msg.getContent();
//            if(MsgTypeEnum.IMG.getState().equals(msg.getType())){
//                 msgContent = "[图片]";
//            }else if(MsgTypeEnum.VOICE.getState().equals(msg.getType())){
//                 msgContent = "[语音]";
//            }else if(MsgTypeEnum.MEDIA.getState().equals(msg.getType())){
//                 msgContent = "[视频]";
//            }else if(MsgTypeEnum.FRIEND.getState().equals(msg.getType())){
//                 msgContent = "[好友]";
//            }

            //保存发送人消息会话
//            MsgSessionEntity msgSessionEntity = new MsgSessionEntity(msg.getToId(),msg.getFromId(),msg.getChatType(),msgContent,msg.getTime(),msg.getGuid());
//            msgSessionService.saveMsgSession(msgSessionEntity);
//
//            //单聊才保存接收人会话,群聊不保存
//            if(ChatTypeEnum.SINGLECHAT.getState().equals(msg.getChatType())){
//                //保存接收人消息会话
//                MsgSessionEntity msgSessionEntity1 = new MsgSessionEntity(msg.getFromId(),msg.getToId(),msg.getChatType(),msgContent,msg.getTime(),msg.getId());
//                msgSessionService.saveMsgSession(msgSessionEntity1);
//            }

        }
    }


    /**
     * 发送单聊消息
     *
     * @param msg
     */
    private void sendMsg(MsgPb.Message msg) {
        //如果不在线
        Session session = SessionUtil.sessions.get(msg.getToId());
        session.getChannel().writeAndFlush(msg);
    }


    /**
     * 发送群聊消息
     *
     * @param groupMsg
     * @return
     */
    private void sendGroupMsg(MsgPb.Message msg) {
        Long groupId = msg.getToId();
        MyChannelGroup channelGroup = GroupUtil.getGroup(groupId);
        channelGroup.broadcast(msg);//群发消息
    }


    /**
     * 处理单聊中掉线的人
     * TODO 个推并且保存到数据库
     *
     * @param msg
     */
    private void sendOffLineMsg(MsgPb.Message msg) {

    }


    /**
     * 处理群聊中掉线的人
     * TODO 个推并且保存到数据库
     *
     * @param msg     群聊消息
     * @param userIds 群中没有在线的人
     */
    private void sendOffLineGroupMsg(MsgPb.Message msg, List<Long> userIds) {

    }

    /**
     * 发送欢迎
     *
     * @param channel
     */
    private void sendHello(Channel channel) {
        MsgPb.Message.Builder builder = MsgPb.Message.newBuilder();
        builder.setType(MsgEnum.CONNECT.getState());
        builder.setContent("你好，欢迎使用YF聊天科技!");
        channel.writeAndFlush(builder);
    }

    /**
     * 发送心跳
     *
     * @param channel
     */
    private void sendHeart(Channel channel) {
        MsgPb.Message.Builder builder = MsgPb.Message.newBuilder();
        builder.setType(MsgEnum.KEEPALIVE.getState());
        builder.setContent("收到心跳,你还活着!");
        channel.writeAndFlush(builder);
    }


}
